using System;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Text;
using System.Collections.Generic;

namespace monoServer
{
	public class CommunicatorParallel : CommunicatorCommon
	{
		private Thread cThread;
		public bool threadStarted;
		private List<ConnectorBase> connectors;
		
		public CommunicatorParallel (TcpClient c, DataManager dm, Logger l) : base(c, dm, l)
		{
			this.connectors = new List<ConnectorBase>();
			this.threadStarted = true;
			this.cThread = new Thread(this.start);
			this.cThread.Start();
		}
		
		public void addConnector(TableConnector tc)
		{
			this.connectors.Add(tc);
		}
		
		public void closeConnection()
		{
			this.cron.stopAllJobs();
			this.threadStarted = false;
			this.stream.Close();
			this.client.Close();
			this.cThread.Abort();
		}
		
		public void sendPingResponse(string key)
		{
			//Telegram t = new Telegram("PING", Telegram.RESPONSE, this.dm.currentTelegramKey);
			//t.addParameter(key);
			Telegram t = Telegram.getResponse(this.dm.currentTelegramKey, key);
			this.sendTelegram(t);
		}
		
		public void start()
		{
			while(this.threadStarted)
			{
				if(stream.DataAvailable)
				{
					string str_telegram = this.readSingleTelegramAsString();
					/*
					if(!t.keyWord.Equals("ACKNOWLEDGE"))
					{
						// Bestätigung des Empfangs des Telegrams versenden (aber nur wenn das empfange Telegramm kein ACKNOWLEDGE ist
						Telegram tt = new Telegram(t, this.dm.currentTelegramKey);
						this.sendTelegram(tt);
						this.commandQueue.Enqueue(t);
					} else {
						//this.sendTelegrams.deleteRow("id", t[0]);
						this.sendTelegrams.modifyRow("id", t[0], "ack", true);
					}
					*/
					Telegram t = Telegram.Parse(str_telegram);
					
					if(t.type.Equals(Telegram.ACKNOWLEDGE))
					{
						// In der Tabelle eintragen dass das Acknowledge von telegramm eingetroffen ist
						this.sendTelegrams.modifyRow("id", t.acknowledgeKey, Telegram.ACKNOWLEDGE, true);
					} else {
						// Ein Acknowledge des Telegramms versenden
						Telegram tt = new Telegram(t, this.dm.currentTelegramKey);
						this.sendTelegram(tt);
						
						// Telegram in entprechende Verarbeitungs Queue schieben
						if(t.type.Equals(Telegram.REQUEST))
							this.requestQueue.Enqueue(t);
						if(t.type.Equals(Telegram.RESPONSE))
							this.responseQueue.Enqueue(t);
						if(t.type.Equals(Telegram.CONNECTOR))
						{
							//this.connector.addRow(t);
							for(int i=0; i<=this.connectors.Count-1; i++)
							{
								ConnectorBase cb = this.connectors[i];
								if(cb.id == ulong.Parse(t[0]))
								{
									// Richtiger Connector gefunden
									// Welcher ConnectorTyp isses denn?
									// Is egal, wird kurzerhand methode process aufgerufen
									
								}
							}
						}
					}
				}
			}
		}
	}
}

